//
// * Copyright (c) 2002-2009 "Neo Technology,"
// *     Network Engine for Objects in Lund AB [http://neotechnology.com]
// *
// * This file is part of Neo4j.
// * 
// * Neo4j is free software: you can redistribute it and/or modify
// * it under the terms of the GNU Affero General Public License as
// * published by the Free Software Foundation, either version 3 of the
// * License, or (at your option) any later version.
// * 
// * This program is distributed in the hope that it will be useful,
// * but WITHOUT ANY WARRANTY; without even the implied warranty of
// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// * GNU Affero General Public License for more details.
// * 
// * You should have received a copy of the GNU Affero General Public License
// * along with this program. If not, see <http://www.gnu.org/licenses/>.
// 
namespace org.neo4j.kernel.impl.cache
{


	public class SoftLruCache<K, V> : Cache<K, V>
	{
		private readonly ConcurrentHashMap<K, SoftValue<K, V>> cache = new ConcurrentHashMap<K, SoftValue<K, V>>();

		private readonly SoftReferenceQueue<K, V> refQueue = new SoftReferenceQueue<K, V>();

		private readonly string name;

		public SoftLruCache(string name)
		{
			this.name = name;
		}

		public virtual void put(K key, V @value)
		{
			SoftValue<K, V> @ref = new SoftValue<K, V>(key, @value, (ReferenceQueue<V>) refQueue);
			cache.put(key, @ref);
		}

		public virtual V @get(K key)
		{
			SoftReference<V> @ref = cache.get(key);
			if (@ref != null)
			{
				return @ref.get();
			}
			return null;
		}

		public virtual V remove(K key)
		{
			SoftReference<V> @ref = cache.Remove(key);
			if (@ref != null)
			{
				return @ref.get();
			}
			return null;
		}


		public virtual int size()
		{
			return cache.size();
		}

		public virtual void pollAll()
		{
//JAVA TO VB & C# CONVERTER TODO TASK: Java wildcard generics are not converted to .NET:
//ORIGINAL LINE: SoftValue<?,?> cv;
			SoftValue<?, ?> cv;
//JAVA TO VB & C# CONVERTER TODO TASK: Java wildcard generics are not converted to .NET:
//ORIGINAL LINE: while ((cv = (SoftValue<?,?>) refQueue.poll()) != null)
			while ((cv = (SoftValue<?, ?>) refQueue.poll()) != null)
			{
				cache.Remove(cv.key);
			}
		}

		public virtual void clear()
		{
			cache.Clear();
		}

		public virtual void elementCleaned(V @value)
		{
		}

		public virtual string Name
		{
			get
			{
				return name;
			}
		}

		public virtual bool isAdaptive()
		{
			return true;
		}

		public virtual int maxSize()
		{
			return -1;
		}

		public virtual void resize(int newSize)
		{
		}

		public virtual void setAdaptiveStatus(bool status)
		{
		}
	}
}